package com.hxqc.nc.report.web.configure;

import com.hxqc.nc.report.core.nc.sys.model.SysUser;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.DefaultHandshakeHandler;

import java.security.Principal;
import java.util.Map;

/**
 * 这个类的作用是,如果不使用spring security 等安全框架时,webSocket得不到应用中的session,
 * 在这里自定义 Principal 后，之后让webSocket得到具体指定的session,这样就可以指定发送给哪个用户的时候，
 * 根据这里定义的字段直接指派,如果没有这个类的实现的话,是指派不到的.
 * 参考 : https://segmentfault.com/a/1190000009038991
 *
 * @author leihz
 * @date 2017/7/20 20:14
 */
public class MyHandshakeHandler extends DefaultHandshakeHandler {
    ///该方法可以重写用来为用户 添加标识 返回principal
    @Override
    protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler,
                                      Map<String, Object> attributes) {

            return  new MyPrincipal((SysUser) attributes.get("user"));
    }

    /**
     * 自定义 Principal
     */
    class MyPrincipal implements Principal{

        private SysUser user;

        public MyPrincipal(SysUser user) {
            this.user = user;
        }

        /**
         * 这里指定的用什么，到时候指定用户发送的时候就要用什么
         * return user.getUserName() 到时候指定用户时，用 user name字段
         * return user.getId() 到时候指定用户时，用 user id字段
         */
        @Override
        public String getName() {

            //return String.valueOf(user.getId());
            return user.getUserName();
        }

    }

}
